命名空間是一種將集群組織成虛擬子集群的方法——當不同的團隊或項目共享一個 Kubernetes 集群時,它們會很有幫助。集群內支持任意數量的命名空間,每個命名空間在邏輯上彼此分離,但能夠相互通信。命名空間不能相互嵌套。Kubernetes 中存在的任何資源都存在于默認命名空間或集群操作員創建的命名空間中。只有節點和持久存儲卷存在于命名空間之外;這些低級資源對集群中的每個命名空間始終可見。
Kubernetes 中的“默認”命名空間是什么?
Kubernetes 提供了三個開箱即用的命名空間。他們是:
- default:顧名思義,這是每個 Kubernetes 命令默認引用的命名空間,也是每個 Kubernetes 資源默認所在的位置。在創建新的命名空間之前,整個集群都處于“默認”狀態。
- kube-system:用于 Kubernetes 組件 ,應避免使用。
- kube-public: 用于公共資源。不推薦用戶使用。
為什么使用 Kubernetes 命名空間?
Kubernetes 命名空間有很多用例,包括:
- 允許團隊或項目存在于自己的虛擬集群中,而不必擔心影響彼此的工作。
- 通過將用戶和進程限制到某些命名空間來增強基于角色的訪問控制 (RBAC)。
- 通過資源配額實現集群資源在多個團隊和用戶之間的劃分。
- 提供一種分離容器化應用程序的開發、測試和部署的簡單方法,使整個生命周期能夠在同一個集群上進行。
什么時候應該使用多個 Kubernetes 命名空間?
小型團隊或小型組織可能會完全滿足使用默認命名空間。如果不需要將開發人員或用戶彼此隔離,這一點尤其重要。但是,擁有多個命名空間有許多有用的好處,包括:
- 隔離。 大型或成長中的團隊可以使用命名空間將他們的項目和微服務相互隔離。團隊可以毫無問題地在不同的工作區中重復使用相同的資源名稱。此外,對一個工作區中的項目執行操作永遠不會影響其他工作區。
- 組織。 使用單個集群進行開發、測試和生產的組織可以使用命名空間來沙箱開發和測試環境。這可確保生產代碼不受開發人員或測試人員在整個應用程序生命周期中在他們自己的命名空間中所做的更改的影響。
- 權限。 命名空間支持使用 Kubernetes RBAC,因此團隊可以定義角色,將權限或能力列表分組到一個名稱下。這可以確保只有授權用戶才能訪問給定命名空間中的資源。
- 資源控制。 通過定義 CPU 或內存利用率的資源配額,可以在命名空間上設置策略驅動的資源限制。這可以確保每個項目或命名空間都有運行所需的資源,并且沒有一個命名空間占用所有可用資源。
- 表現。 使用命名空間有助于提高給定集群的性能。如果一個集群被劃分為不同項目的多個命名空間,Kubernetes API 在執行操作時將有更少的項目來搜索。這可以減少延遲并加快集群上運行的每個應用程序的整體應用程序性能。
Pod 如何跨 Kubernetes 命名空間進行通信?
盡管命名空間彼此分離,但它們可以輕松地相互通信。通過使用 DNS 尋址的擴展形式,Kubernetes DNS 服務目錄可以通過名稱輕松定位任何服務:
..svc.cluster.local
只需將命名空間名稱添加到服務名稱即可訪問集群上任何命名空間中的服務。例如,要訪問 development 命名空間中的工資單服務,您將使用地址
payroll.development
要訪問生產命名空間中的工資單服務,您將使用:
payroll.production
請注意,可以選擇使用網絡策略來控制命名空間之間的訪問。例如,網絡策略可以允許或拒絕來自其他命名空間的所有流量。網絡策略僅適用于連接,不能替代執行數據包檢查的防火墻。
與命名空間相關的基本 kubectl 命令有哪些?
查找當前 Kubernetes 命名空間的命令是什么?
可以使用命令顯示集群中的所有命名空間:
kubectl get namespace
這將返回集群中所有命名空間的列表,包括默認命名空間,以及它們的狀態和年齡。
創建新的 Kubernetes 命名空間的命令是什么?
命名空間只需使用以下命令創建:
kubectl create namespace
與任何其他 Kubernetes 資源一樣,也可以創建 YAML 文件并將其應用于創建命名空間:
newspace.yaml:
種類:命名空間
apiVersion:v1
元數據:
名稱:新空間
標簽:
名稱:newspacekubectl apply -f newspace.yaml
如何在 Kubernetes 命名空間之間切換?
要在創建命名空間后對其進行尋址,操作必須在命令中包含 –namepsace= 選項。由于這會變得很麻煩,因此可以通過使用 kubectl config 命令在集群上下文中設置命名空間來更改默認命名空間。
例如,要將默認命名空間更改為名為“testing”的命名空間,您需要輸入:
kubectl config set-context --current --namespace=testing
這會將默認命名空間設置為“testing”,以供將來所有 kubectl 命令使用。
如何重命名 Kubernetes 命名空間?
重命名 Kubernetes 命名空間不是標準做法,因此請謹慎選擇命名空間(默認值之外)。
如何刪除 Kubernetes 命名空間?
使用以下命令刪除命名空間:
kubectl delete namespaces
由于刪除是異步活動,因此命名空間將顯示為“終止”,直到命名空間被刪除。
關于刪除 Kubernetes 命名空間的警告
刪除命名空間是最后的動作。命名空間中的所有內容,包括所有服務、正在運行的 pod 和工件都將被刪除。垃圾收集將在該命名空間中存在的任何東西上運行。在執行此操作之前,請確保應刪除命名空間中的所有內容。